/**
 * 语音高亮处理模块
 * 负责在语音播放时处理文本高亮
 */
class VoiceHighlighter {
  constructor() {
    this.currentHighlightedMessageId = null;
    this.currentHighlightedText = '';
    this.highlightLevels = {
      MESSAGE: 'message',   // 消息级别高亮
      PARAGRAPH: 'paragraph', // 段落级别高亮
      SENTENCE: 'sentence',   // 句子级别高亮
      WORD: 'word'          // 单词级别高亮
    };
    
    // 初始化事件监听
    this.initEventListeners();
  }
  
  /**
   * 初始化事件监听器
   */
  initEventListeners() {
    // 监听语音高亮事件
    document.addEventListener('voiceHighlight', (e) => {
      const { messageId, text } = e.detail;
      this.highlightText(messageId, text);
    });
    
    // 监听清除高亮事件
    document.addEventListener('voiceClearHighlight', () => {
      this.clearHighlights();
    });
    
    // 在页面离开时清除所有高亮
    window.addEventListener('beforeunload', () => {
      this.clearHighlights();
    });
  }
  
  /**
   * 高亮指定消息中的文本
   * @param {string} messageId 消息ID
   * @param {string} text 要高亮的文本
   * @param {string} level 高亮级别
   */
  highlightText(messageId, text, level = this.highlightLevels.SENTENCE) {
    // 先清除之前的高亮
    this.clearHighlights();
    
    if (!messageId || !text) return;
    
    // 查找消息元素
    const messageElement = document.getElementById(`message-${messageId}`);
    if (!messageElement) return;
    
    const contentElement = messageElement.querySelector('.message-content');
    if (!contentElement) return;
    
    //console.log("[高亮] 处理消息:", messageId, "文本:", text.substring(0, 50) + (text.length > 50 ? "..." : ""));
    
    // 记录当前高亮状态
    this.currentHighlightedMessageId = messageId;
    this.currentHighlightedText = text;
    
    try {
        switch(level) {
            case this.highlightLevels.MESSAGE:
                // 整个消息高亮
                contentElement.classList.add('voice-playing');
                break;
                
            case this.highlightLevels.PARAGRAPH:
                // 查找包含文本的段落
                this.highlightParagraph(contentElement, text);
                break;
                
            case this.highlightLevels.SENTENCE:
                // 句子级高亮
                this.highlightSentence(contentElement, text);
                break;
                
            case this.highlightLevels.WORD:
                // 单词级高亮
                this.highlightWords(contentElement, text);
                break;
        }
        
        // 确保高亮区域在视野内
        this.scrollToHighlight(messageElement);
        
    } catch (error) {
        //console.error("[高亮] 处理错误:", error);
        // 容错处理 - 如果高亮处理失败，至少标记整个消息
        contentElement.classList.add('voice-playing');
    }
  }
  
  /**
   * 高亮段落
   * @param {Element} container 容器元素 
   * @param {string} text 要高亮的文本
   */
  highlightParagraph(container, text) {
    // 查找包含目标文本的段落
    const paragraphs = container.querySelectorAll('p');
    for (const p of paragraphs) {
      if (p.textContent.includes(text)) {
        p.classList.add('voice-highlight-paragraph');
        p.classList.add('voice-playing');
        break;
      }
    }
  }
  
  /**
   * 高亮句子
   * @param {Element} container 容器元素
   * @param {string} text 要高亮的文本
   */
  highlightSentence(container, text) {
    // 实现句子级别高亮，需要更复杂的文本解析
    // 这里使用简化的实现
    container.innerHTML = container.innerHTML.replace(
      text,
      `<span class="voice-highlight-sentence">${text}</span>`
    );
  }
  
  /**
   * 高亮单词
   * @param {Element} container 容器元素
   * @param {string} text 要高亮的文本
   */
  highlightWords(container, text) {
    // 单词级别的高亮，适合英文内容
    const words = text.split(' ');
    words.forEach(word => {
      if (word.length < 2) return; // 忽略短单词
      
      container.innerHTML = container.innerHTML.replace(
        new RegExp(`\\b${word}\\b`, 'g'),
        `<span class="voice-highlight-word">${word}</span>`
      );
    });
  }
  
  /**
   * 清除所有高亮样式
   */
  clearHighlights() {
    // 清除消息级别高亮
    document.querySelectorAll('.voice-playing').forEach(el => {
      el.classList.remove('voice-playing');
    });
    
    // 清除段落级别高亮
    document.querySelectorAll('.voice-highlight-paragraph').forEach(el => {
      el.classList.remove('voice-highlight-paragraph');
    });
    
    // 清除句子和单词级高亮需要DOM重建，这里简化处理
    // 实际项目中可能需要记录原DOM结构
    
    // 重置当前高亮状态
    this.currentHighlightedMessageId = null;
    this.currentHighlightedText = '';
  }
  
  /**
   * 确保高亮区域可见
   * @param {Element} element 需要滚动到视野内的元素
   */
  scrollToHighlight(element) {
    if (!element) return;
    
    const rect = element.getBoundingClientRect();
    const isVisible = 
      rect.top >= 0 &&
      rect.bottom <= (window.innerHeight || document.documentElement.clientHeight);
      
    if (!isVisible) {
      element.scrollIntoView({ behavior: 'smooth', block: 'center' });
    }
  }
  
  /**
   * 根据文本长度自动选择高亮级别
   * @param {string} messageId 消息ID
   * @param {string} text 文本内容
   */
  autoHighlight(messageId, text) {
    if (!text || !messageId) return;
    
    let level;
    if (text.length < 10) {
      level = this.highlightLevels.WORD;
    } else if (text.length < 50) {
      level = this.highlightLevels.SENTENCE;
    } else if (text.length < 200) {
      level = this.highlightLevels.PARAGRAPH;
    } else {
      level = this.highlightLevels.MESSAGE;
    }
    
    this.highlightText(messageId, text, level);
  }
}

// 创建单例实例
window.VoiceHighlighter = new VoiceHighlighter();